/*
 * Tablero.cpp
 *
 *  Created on: 16/10/2013
 *      Author: jaschulz
 */
#include <stdio.h>
#include <stdlib.h>     /* srand, rand */
#include <math.h>
#include "Tablero.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>       /* time */
#include <algorithm>
#include <string>
#include <vector>

#define COLUMNAS 8
#define FILAS 8

using std::vector;

Tablero::Tablero(unsigned int nFilas, unsigned int nCols){
	board = new vector<CeldaBase*>();
	filas = nFilas;
	columnas = nCols;
}

Tablero::Tablero() {
	board = new vector<CeldaBase*>();
}

Tablero::~Tablero() {
	delete[] board;
}

unsigned int Tablero::getFilas() {
	return filas;
}

unsigned int Tablero::getColumnas() {
	return columnas;
}

CeldaBase * Tablero::getCelda(unsigned int nFila, unsigned int nCol){
	unsigned int nCel;
	nCel = nCol * filas + nFila;
	return board->at(nCel);
}

CeldaBase * Tablero::getCelda(unsigned int nCel) {
	return board->at(nCel);
}

void Tablero::setCelda(unsigned int nFila, unsigned int nCol, CeldaBase* c){
	unsigned int nCel;
	nCel = nCol * filas + nFila;
	board->at(nCel) = c;
}

void Tablero::addCelda(CeldaBase* celda) {
	board->push_back(celda);
}

void Tablero::setColumnas(unsigned int cols) {
	columnas = cols;
}

void Tablero::setFilas(unsigned int fils) {
	filas = fils;
}

vector<CeldaBase*>* Tablero::getCeldas() {
	return board;
}

//valida la existencia de matches posibles
bool Tablero::checkPossibleMatches() {
	for (unsigned int y = 0; y < this->getFilas(); y++){
		for (unsigned int x = 0; x < this->getColumnas(); x++) {
			if (getCelda(x,y)->getColorGolosina() == Pieza::dorado){
				return true;
			}
			bool der;
			if ((x + 1) < this->getColumnas()) {
				der = (this->getCelda(x, y)->getColorGolosina()
						== this->getCelda(x + 1, y)->getColorGolosina());
				if (der) {
					//no va x + 2 porque se que en esa posicion
					//no hay una igual, sino habria detectado el match
					if ((x + 3) < this->getColumnas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 3, y)->getColorGolosina()){
							return true;
						}
					}
					if ((y + 1) < this->getFilas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 2, y + 1)->getColorGolosina()){
							return true;
						}
					}
					if (y  > 1) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 2, y - 1)->getColorGolosina()){
							return true;
						}
					}
				} else {
					int cantidad = 0;
					if ((x + 2) < this->getColumnas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
								this->getCelda(x + 2, y)->getColorGolosina()){
							cantidad++;
						}
					}
					if (y > 1) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 1, y - 1)->getColorGolosina()){
							cantidad++;
						}
					}
					if ((y + 1) < this->getFilas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 1, y + 1)->getColorGolosina()){
							cantidad++;
						}
					}
					if(cantidad > 1){
						return true;
					}
				}
			}
			bool abajo;
			if ((y + 1) < this->getFilas()) {
				abajo = (this->getCelda(x, y)->getColorGolosina()
						== this->getCelda(x, y + 1)->getColorGolosina());
				if (abajo) {
					//no va y + 2 porque se que en esa posicion
					//no hay una igual, sino habria detectado el match
					if ((y + 3) < this->getFilas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
								this->getCelda(x, y + 3)->getColorGolosina()){
							return true;
						}
					}
					if ((x + 1) < this->getColumnas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 1, y + 2)->getColorGolosina()){
							return true;
						}
					}
					if (x > 1){
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x - 1, y + 2)->getColorGolosina()){
							return true;
						}
					}
				} else {
					int cantidad = 0;
					if ((y + 2) < this->getFilas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
								this->getCelda(x, y + 2)->getColorGolosina()){
							cantidad++;
						}
					}
					if (x > 1) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x - 1, y + 1)->getColorGolosina()){
							cantidad++;
						}
					}
					if ((x + 1) < this->getColumnas()) {
						if (this->getCelda(x, y)->getColorGolosina() ==
							this->getCelda(x + 1, y + 1)->getColorGolosina()){
							cantidad++;
						}
					}
					if(cantidad > 1){
						return true;
					}
				}
			}
		}
	}
	return false;
}

